Skip to content
On this page

总结

  • 数组
    • ${ARRAY[@]}: 输出数组全部变量
    • ${ARRAY[-1]}: 输出最后一个变量
    • ${#ARRAY}: 输出数组长度
    • ${ARRAY[@]:n:m: 从 index 为 n 的变量开始打印,打印 m 个,zsh 坐标也从 0 开始
    • ${ARRAY[n,m]}: zsh 特有,将 n 到 m 作为切片
    • ARRAY+=(): 推入数组
    • ARRAY[n]=(): 删除 index 为 n 的变量
    • ARRAY[n]=x: 修改 index 为 n 的变量
  • 对象
    • declare -A / typeset -A: 定义对象
    • ${Object[@]} / ${(v)Object[@]}: 输出对象所有 value
    • ${!Object[@]} / ${(k)Object[@]}: 输出对象所有 key
    • ${(kv)Object[@]}: 输出对象所有 key value

提问

  • [x] 1. 如何定义数组与字典

    数组: array=('a' 'b') 括号和空格
    对象: declare -A / typeset -A

  • [x] 2. 如何打印数组的全部值

    ${ARRAY[@]}

1. 前提提要、场景

命令的前置变量,我们可以通过类似 NODE_ENV=production 直接赋值去设置变量。数组 Array 也可以直接赋值。

2. Array 数组

通过 括号空格 来定义数组

sh
$ array=('a' 'b' 'c')

bash 中下标以 0 开始,zsh 中下标以 1 开始。
${ARRAY[@]:n:m} zsh 此时的 n 也是从 0 开始

${ARRAY[@]}: 访问数组全部变量

sh
$ array=('a' 'b' 'c' 'd' 'e')

$ echo ${array}
a b c d e

# 打印数组全部内容
$ echo ${array[@]}
a b c d e

$ echo ${array[1]}
a

# 打印最后一个变量
$ echo ${array[-1]}
e

# 打印数组长度
$ echo ${#array}
5

# 从 index 为 2 的变量开始打印,打印 3 个
# zsh 此时下标又从 0 开始了
$ echo ${array[@]:2:3}
c d e

# 注意:在 zsh 中可通过 [2,3] 作为切片
$ echo ${array[2,3]}
b c

# 推入数组
$ array+=('f' 'g')
$ echo ${array[@]}
a b c d e f g

# 删除数组某一变量
$ unset array[3]
$ echo ${array[@]}
a b d e f g

# zsh 删除通过赋值空数组
$ array[3]=()
a b d e f g

# 修改
$ array[1]=9
$ echo ${array[@]}
9 b d e f g

3. Associative Array 类似 js 的对象

javascript 中有对象,shell 可以通过 declare -Atypeset -A 定义

sh
# 定义
$ declare -A object

# 修改值
$ object[a]=3
$ object[b]=4
$ object[c]=5

# 打印全部 value
$ echo ${object[@]}
3 4 5

# 打印全部 key 
# zsh 无效 下面有 zsh 的
$ echo ${!object[@]}

zsh 使用以下的

sh
# 打印所有的 keys
$ echo ${(k)object[@]}

# 打印所有的 values
$ echo ${(v)object[@]}

# 打印所有的 keys/values
$ echo ${(kv)object[@]}